#ifndef __GAMEMAP__
#define __GAMEMAP__

#include <cstring>
#include <iostream>
#include <memory>

#include "Constant.hpp"
#include "Vector2D.hpp"

typedef Vec2i POS;

//四个方向分别是：左，下，右，上（逆时针）
inline constexpr POS DIR[4] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};

enum class NODE_TYPE
{
    SNAKE_HEAD,
    SNAKE_BODY,
    FRUIT
};

using namespace GameMap;

class MAP
{
public:
    static MAP &Singleton();
    MAP(MAP &) = delete;
    MAP &operator=(const MAP &) = delete;
    MAP() {}

    void LoadMap();
    void output();

    void putItem(POS _pos, NODE_TYPE type, int _id);

    //获取地图上_pos位置的物品id
    int getNodeID(POS _pos);

    //获取地图上_pos位置的物品的subid
    int getSubID(POS _pos);

    //获取地图上_pos位置的用户id
    int getBelong(POS _pos);

    NODE_TYPE getNodeType(POS _pos);
    void update();

private:
    MAP() = default;
    ~MAP() = default;
    bool UsedPos[MAP_SIZE_X][MAP_SIZE_Y];
    struct NODE
    {
        //格点物品绝对编号
        int id;
        //格点物品的相对编号
        int subid;
        //0为空类型，1为蛇头，2为蛇身，3为普通食物，4为bonus食物
        NODE_TYPE type;
    } _map[MAP_SIZE_X][MAP_SIZE_Y];
    std::shared_ptr<int> _score;
};

#endif